]) ([GdkQuartzWindow -windowDidBecomeMain:]): Keep a stack of main windows
authorRichard Hult <richard@imendio.com>
Sat, 7 Jul 2007 16:19:40 +0000 (16:19 +0000)
committerRichard Hult <rhult@src.gnome.org>
Sat, 7 Jul 2007 16:19:40 +0000 (16:19 +0000)
2007-07-07  Richard Hult  <richard@imendio.com>

* gdk/quartz/GdkQuartzWindow.c ([GdkQuartzWindow -windowDidResignMain:])
([GdkQuartzWindow -windowDidBecomeMain:]):
* gdk/quartz/gdkwindow-quartz.c (_gdk_quartz_window_did_resign_main)
(_gdk_quartz_window_did_become_main, gdk_window_hide)
(_gdk_windowing_window_destroy): Keep a stack of main windows and
select the most recent one when hiding/closing the current one.

svn path=/trunk/; revision=18396

ChangeLog
gdk/quartz/GdkQuartzWindow.c
gdk/quartz/gdkprivate-quartz.h
gdk/quartz/gdkwindow-quartz.c

index 54f02e731a60c9a48820554ba0bf8da705712540..3878ba8f644b28885bfb84ae78886a9ed59990fb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2007-07-07  Richard Hult  <richard@imendio.com>
+
+       * gdk/quartz/GdkQuartzWindow.c ([GdkQuartzWindow -windowDidResignMain:]) 
+       ([GdkQuartzWindow -windowDidBecomeMain:]): 
+       * gdk/quartz/gdkwindow-quartz.c (_gdk_quartz_window_did_resign_main)
+       (_gdk_quartz_window_did_become_main, gdk_window_hide)
+       (_gdk_windowing_window_destroy): Keep a stack of main windows and
+       select the most recent one when hiding/closing the current one.
+
 2007-07-07  Johan Dahlin  <jdahlin@async.com.br>
 
        * gtk/gtk-builder-convert (GtkBuilderConverter._convert_textview_text): 
index 0ffefc5d6c0c4f810fc686d37fb951b3c2778b85..4d0ccd12e019d1df5cb5ae6df4aba55f67f3518c 100644 (file)
   _gdk_quartz_events_update_focus_window (window, FALSE);
 }
 
+-(void)windowDidBecomeMain:(NSNotification *)aNotification
+{
+  GdkWindow *window;
+
+  window = [[self contentView] gdkWindow];
+  _gdk_quartz_window_did_become_main (window);
+}
+
+-(void)windowDidResignMain:(NSNotification *)aNotification
+{
+  GdkWindow *window;
+
+  window = [[self contentView] gdkWindow];
+  _gdk_quartz_window_did_resign_main (window);
+}
+
 /* Used in combination with NSLeftMouseUp in sendEvent to keep track
  * of when the window is being moved with the mouse.
  */
index b201ca7a4db7c872b913cc3e116b85a22a496d9e..875dadc8b45d89d5e6a198dd7842a168aa93061d 100644 (file)
@@ -140,7 +140,8 @@ GdkWindow *_gdk_quartz_window_find_child            (GdkWindow *window,
                                                     gint       y);
 void       _gdk_quartz_window_attach_to_parent      (GdkWindow *window);
 void       _gdk_quartz_window_detach_from_parent    (GdkWindow *window);
-
+void       _gdk_quartz_window_did_become_main       (GdkWindow *window);
+void       _gdk_quartz_window_did_resign_main       (GdkWindow *window);
 
 /* Events */
 void         _gdk_quartz_events_update_focus_window   (GdkWindow *new_window,
index e7ab47868b0565c5f7e854237de423c17dd83357..f153a15bdd577dede1dee4a56d802dea302d56c4 100644 (file)
 
 static gpointer parent_class;
 
-static GSList *update_windows = NULL;
-static guint update_idle = 0;
+static GSList *update_windows;
+static guint   update_idle;
+
+static GSList *main_window_stack;
 
 #define WINDOW_IS_TOPLEVEL(window)                \
   (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD && \
@@ -498,6 +500,44 @@ _gdk_quartz_window_find_child (GdkWindow *window,
   return NULL;
 }
 
+void
+_gdk_quartz_window_did_become_main (GdkWindow *window)
+{
+  main_window_stack = g_slist_remove (main_window_stack, window);
+
+  if (GDK_WINDOW_OBJECT (window)->window_type != GDK_WINDOW_TEMP)
+    main_window_stack = g_slist_prepend (main_window_stack, window);
+}
+
+void
+_gdk_quartz_window_did_resign_main (GdkWindow *window)
+{
+  GdkWindow *new_window = NULL;
+
+  if (main_window_stack)
+    new_window = main_window_stack->data;
+  else
+    {
+      GList *toplevels;
+
+      toplevels = gdk_window_get_toplevels ();
+      if (toplevels)
+        new_window = toplevels->data;
+      g_list_free (toplevels);
+    }
+
+  if (new_window &&
+      new_window != window &&
+      GDK_WINDOW_IS_MAPPED (new_window) &&
+      GDK_WINDOW_OBJECT (new_window)->window_type != GDK_WINDOW_TEMP)
+    {
+      GdkWindowObject *private = (GdkWindowObject *) new_window;
+      GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+
+      [impl->toplevel makeKeyAndOrderFront:impl->toplevel];
+    }
+}
+
 GdkWindow *
 gdk_window_new (GdkWindow     *parent,
                GdkWindowAttr *attributes,
@@ -739,6 +779,7 @@ _gdk_windowing_window_destroy (GdkWindow *window,
                               gboolean   foreign_destroy)
 {
   update_windows = g_slist_remove (update_windows, window);
+  main_window_stack = g_slist_remove (main_window_stack, window);
 
   if (!recursing && !foreign_destroy)
     {
@@ -814,15 +855,14 @@ show_window_internal (GdkWindow *window,
         [impl->toplevel makeKeyAndOrderFront:impl->toplevel];
       else
         [impl->toplevel orderFront:nil];
-
-      [impl->view setNeedsDisplay:YES];
     }
   else
     {
       [impl->view setHidden:NO];
-      [impl->view setNeedsDisplay:YES];
     }
 
+  [impl->view setNeedsDisplay:YES];
+
   if (all_parents_shown (private->parent))
     _gdk_quartz_events_send_map_events (window);
 
@@ -922,6 +962,11 @@ gdk_window_hide (GdkWindow *window)
 
   if (impl->toplevel) 
     {
+      /* Update main window. */
+      main_window_stack = g_slist_remove (main_window_stack, window);
+      if ([NSApp mainWindow] == impl->toplevel)
+        _gdk_quartz_window_did_resign_main (window);
+
       if (impl->transient_for)
         _gdk_quartz_window_detach_from_parent (window);